#include <iostream>
#include <string>
#include <istream>

#include "Screen.h"
#include "Sales_data.h"
#include "Winsowmgr.h"

using std::string;
using std::cout;
using std::endl;
using std::cin;
/*
 * Person类
 */

string s("001");
struct Person
{
	/*
	 * 为什么类里面不能使用直接初始化
	 * c++规定const静态类成员可以直接初始化，其他非const的静态类成员需要在类外全局作用域下初始化，且不能使用static关键字。
	 * 详细分析见: https://blog.csdn.net/qq_43915356/article/details/107368218
	 */

	string getID() const
	{
		return ID;
	}

	string ID = "001";
	string addr = "China";
};


int t7_10()
{
	Sales_data data1("Y00001"), data2("Y00002");
	if (read(read(cin, data1), data2))
	{
		cout << "yes";
	}
	else
	{
		cout << "no";
	}

	return 0;
}

int testF()
{
	Sales_data s(cin);
	print(cout, s);
	return 0;
}

/*
 * 名字查找和类的作用域
 */
typedef int Type;
Type initVal() {return 1;};
class Exercise {
public:
//	typedef double Type;   // 加这条语句会报错
	typedef int Type;    // 这条是合法的
    Type setVal(Type);				// double
    Type initVal(){return 100;};					// double
private:
    int val;
};
Type Exercise::setVal(Type parm) {		// 返回的Type是string类型，形参类型是double类型
    val = parm + initVal();				// initVal调用的类中的
    return val;
}

struct X {
	// 使用了未定义的base值
	// 初始化顺序应该与声明顺序一致
	// 尽量避免使用成员初始化其他成员
	X(int i, int j): rem(i), base(rem % j){ }
	int rem, base;
};

int testDelegating()
{
	/*
	 * 测试委托构造函数
	 */
	Sales_data sd(cin);
	return 0;
}

struct NoDefault
{
	NoDefault(int i): num(i) {}
	int num;
};

struct C
{
	C(NoDefault n): nd(n) {}
	NoDefault nd;
};

int main07()
{
	Person p = Person();
	cout << "print ID of p: " << p.getID() << endl;

	cout << "-------------构造函数-------------" << endl;
	Sales_data sd("Y00001");
	cout << sd.isbn() << endl;

	cout << "------------7-10-------------" << endl;
//	t7_10();

	cout << "------------testF-------------" << endl;
//	int testF();
//	testF();

	cout << endl << "-------------*this--------------" << endl;
	Screen sr(100, 200, '#');

	string::size_type r = 10, l = 0;
	sr.move(0, 4).set('c');

	cout << "------------------友元函数-----------------" << endl;
//	void Winsow_mgr::clear(Winsow_mgr::ScreenIndex i);
	Winsow_mgr sm = Winsow_mgr();
	sm.clear(0);

	cout << "---------------名字查找和类的作用域-------------" << endl;

	cout << "------------------构造函数再探------------------" << endl;

	/*
	 * 对于C++新手来说，常常试图以Sales_data obj(); 定义一个用默认构造函数初始化的对象
	 */
	Sales_data test_d;  // 一个有趣的现象
	cout << "test_d.isbn(): " << test_d.isbn() << endl;

	X x(10,22);
	cout << x.base << " " << x.rem << endl;
	cout << "-----------------委托构造函数------------------" << endl;
	testDelegating();

	cout << "-----默认构造函数与使用默认构造函数初始化的区别-----" << endl;
	NoDefault nd(1);
	C c(nd);

	cout << "-------------隐式类型转换---------------" << endl;
	string null_book = "9-999-99999-9";
//	test_d.combine(null_book);  // 隐式转换
	test_d.combine(static_cast<Sales_data>("9-999-99999-9"));  // 就算加了exp, 还可以使用强制类型转化



	return 0;
}
